﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Iacym.Entities;
using Iacym.BusinessLogic;
using Microsoft.Practices.Unity;
using System.Security.Cryptography;
using System.IO;

namespace Iacym.UI
{
    public partial class FrmMttoUsuario : Form
    {
        [Dependency]
        public IUsuarioBL usuarioBL { get; set; }

        [Dependency]
        public IRolBL rolBL { get; set; }

        [Dependency]
        public IPersonaBL perBL { get; set; }

        [Dependency]
        public IMenuBL menuBL { get; set; }

        [Dependency]
        public IUsuarioMenuBL usuMenuBL { get; set; }

        bool isNew;

        //permisos de menus por asignar
        List<MENU> _listMenusPorAsignar;

        public FrmMttoUsuario()
        {
            InitializeComponent();
            this.BuildUp();
        }

        public void Nuevo()
        {
            isNew = true;
            uSUARIOBindingSource.AddNew();
            gbDetalleUsuario.Enabled = false;
            passwordTextBox.ReadOnly = true;
            txtPasswd.ReadOnly = true;
        }

        public USUARIO _usuario { get; set; }
        public USUARIO currentUsuarioMttoUsuario { get; set; }
    
        public void Editar()
        {
            isNew = false;
            uSUARIOBindingSource.DataSource = _usuario;
            txtPasswd.Text = _usuario.Password;
            passwordTextBox.ReadOnly = true;
            txtPasswd.ReadOnly = true;
            nombreCompletoTextBox.ReadOnly = true;
        }

        private void FrmMttoUsuario_Load(object sender, EventArgs e)
        {
            rOLBindingSource.DataSource = rolBL.GetAllFromRol();

            mENUBindingSource.DataSource = menuBL.GetAllMenu();

            _listMenusPorAsignar = new List<MENU>();
        }

        private void CBRol_SelectedValueChanged(object sender, EventArgs e)
        {
                if (CBRol.SelectedValue != null)
                {
                    rolIdTextBox.Text = CBRol.SelectedValue.ToString();
                }
        }

        private void CBRol_Click(object sender, EventArgs e)
        {
            rOLBindingSource.DataSource = rolBL.GetAllFromRol();
        }

        private void BtnExtPersona_Click(object sender, EventArgs e)
        {
            CargarPersona();
        }

        public void CargarPersona()
        {
            FrmPersona frm = new FrmPersona();
            frm.Extend();
            frm.currentUsuarioPersona = currentUsuarioMttoUsuario;
            frm.ShowDialog();
            if (frm.CurrentPersona != null)
            {
                var nuevaPersona = perBL.GetFromPersonaById(frm.CurrentPersona.Id);
                var usuario = uSUARIOBindingSource.Current as USUARIO;

                usuario.PERSONA = nuevaPersona;
                usuario.PersonaId = nuevaPersona.Id;
                uSUARIOBindingSource.ResetBindings(true);
            }
        }

        /*función de encriptacion MD5 para password*/
        /*public string md5()
        {
            System.Security.Cryptography.MD5 md5;
            md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();

            byte[] encodedBytes = md5.ComputeHash(ASCIIEncoding.Default.GetBytes(_usuario.Password));

            return System.Text.RegularExpressions.Regex.Replace(BitConverter.ToString(encodedBytes).ToUpper(), @"-", "");
        }*/

        //boton verificar........
        private void btnVerificar_Click(object sender, EventArgs e)
        {
            if (passwordTextBox.Text == txtPasswd.Text && passwordTextBox.Text != "")
            {
                MessageBox.Show("Password Correcta", "Mensaje", MessageBoxButtons.OK);
                gbDetalleUsuario.Enabled = true;
                mENUBindingSource.DataSource = menuBL.GetAllMenu();
            }
            else
                MessageBox.Show("Password no Coinciden", "Mensaje", MessageBoxButtons.OK);
        }

        //verificar cont TAB.......
        private void textBox2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
                if (passwordTextBox.Text == txtPasswd.Text && passwordTextBox.Text != "")
                {
                    MessageBox.Show("Password Correcta", "Mensaje", MessageBoxButtons.OK);
                    gbDetalleUsuario.Enabled = true;
                    mENUBindingSource.DataSource = menuBL.GetAllMenu();
                }
                else
                    MessageBox.Show("Password no Coinciden", "Mensaje", MessageBoxButtons.OK);
            }
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            var usuarioMenu = uSUARIO_MENUBindingSource1.Current as USUARIO_MENU;
            if (usuarioMenu != null)
            {
                if (usuarioMenu.Id > 0)
                {
                    usuMenuBL.deleteDetalle(usuarioMenu.Id, usuarioMenu.MenuId);
                }

                var menu = _listMenusPorAsignar.Where(d => d.Id.Equals(usuarioMenu.MenuId)).FirstOrDefault();
                var usuMenu = uSUARIO_MENUBindingSource1.DataSource as List<USUARIO_MENU>;
                var usuario = uSUARIOBindingSource.Current as USUARIO;

                if (menu != null || usuario != null)
                {
                    uSUARIO_MENUBindingSource1.ResetBindings(true);

                    uSUARIO_MENUBindingSource1.RemoveCurrent();
                    _listMenusPorAsignar.Remove(menu);
                }
                else if (usuMenu != null && usuMenu.Count != 0)
                {
                    var usuarioMenuQuitar = usuMenu.Where(d => d.MenuId.Equals(usuarioMenu.MenuId)).FirstOrDefault();

                    uSUARIO_MENUBindingSource1.RemoveCurrent();
                    uSUARIO_MENUBindingSource1.ResetBindings(true);
                     usuMenu.Remove(usuarioMenuQuitar);
                }
                else
                {
                    MessageBox.Show("No hay datos seleccionados", "Mensaje", MessageBoxButtons.OK);
                }
            }
            else
            {
                MessageBox.Show("No hay datos seleccionados", "Mensaje", MessageBoxButtons.OK);
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            var menu = mENUBindingSource.Current as MENU;
            var currentUsuario = uSUARIOBindingSource.Current as USUARIO;

            if (menu != null)
            {
                var detalle = new USUARIO_MENU
                {
                    UsuarioId = currentUsuario.PersonaId,
                    MenuId = menu.Id,
                    MENU = menu,
                    USUARIO = currentUsuario
                };

                var existe = currentUsuario.USUARIO_MENU.Where(dp => dp.MENU.Id.Equals(menu.Id)).SingleOrDefault();

                if (existe == null)
                {
                    currentUsuario.USUARIO_MENU.Add(detalle);
                }
                else
                {
                    MessageBox.Show(detalle.MENU.Descripcion + " ya se encuentra agregado", "Mensaje", MessageBoxButtons.OK);
                }

                _listMenusPorAsignar.Add(menu);
                uSUARIOBindingSource.ResetBindings(true);
                uSUARIO_MENUBindingSource1.ResetBindings(true);
            }
            
        }

        private void btnAgregarTodos_Click(object sender, EventArgs e)
        {
            var listaMenuTodos = mENUBindingSource.DataSource as List<MENU>;
            var currentUsuario = uSUARIOBindingSource.Current as USUARIO;

            if (listaMenuTodos != null)
            {
                foreach (var lista in listaMenuTodos)
                {
                    var detalle = new USUARIO_MENU
                    {
                        UsuarioId = currentUsuario.PersonaId,
                        MenuId = lista.Id,
                        MENU = lista,
                        USUARIO = currentUsuario
                    };

                    var existe = currentUsuario.USUARIO_MENU.Where(dp => dp.MENU.Id.Equals(lista.Id)).SingleOrDefault();

                    if (existe == null)
                    {
                        currentUsuario.USUARIO_MENU.Add(detalle);
                    }
                    else
                    {
                                MessageBox.Show(detalle.MENU.Descripcion + " ya se encuentra agregado", "Mensaje", MessageBoxButtons.OK);
                    }

                    _listMenusPorAsignar.Add(lista);
                    uSUARIOBindingSource.ResetBindings(true);
                    uSUARIO_MENUBindingSource1.ResetBindings(true);
                }
            }
        }

        private void dniTextBox_TextChanged(object sender, EventArgs e)
        {
            var usuario = uSUARIOBindingSource.Current as USUARIO;
            var msg = "ERROR";
            if (usuario != null)
            {
                try
                {
                    usuarioBL.VerificarAsignacion(usuario);
                    MessageBox.Show("USUARIO LIBRE", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    passwordTextBox.ReadOnly = false;
                    txtPasswd.ReadOnly = false;

                }
                catch (Exception ex)
                {
                    msg = ex.Message;
                    var rpt = MessageBox.Show(msg, "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (rpt == DialogResult.Yes)
                    {
                        var usu = usuarioBL.GetAllFromUsuarioByPersonaId(dniTextBox.Text);
                        var usuarioRol = uSUARIOBindingSource.Current as USUARIO;

                        if (usu != null)
                        {
                            usuarioRol.RolId = usu.RolId;
                            usuarioRol.Password = _usuario.Password;
                            txtPasswd.Text = _usuario.Password;
                            gbDetalleUsuario.Enabled = true;

                            mENUBindingSource.DataSource = menuBL.GetAllMenu();

                            uSUARIOBindingSource.DataSource = _usuario;
                        }

                    }
                    else if (rpt == DialogResult.No)
                    {
                        this.Close();
                    }
                }
            }
        }

        public MENU currentMenu { get; set; }
        public USUARIO_MENU currentUsuarioMenu { get; set; }
        public ROL currentRol { get; set; }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            _usuario = uSUARIOBindingSource.Current as USUARIO;
            currentMenu = mENUBindingSource.Current as MENU;
            currentRol = rOLBindingSource.Current as ROL;

            if (_usuario.Password != null && _usuario.PERSONA.Dni != null && _usuario.PERSONA.NombreCompleto != null && currentRol.Id!=0 && _usuario.USUARIO_MENU.Count != 0)
            {
                    if (isNew == true)
                    {
                        FrmVerificarUsuarioMenu frm = new FrmVerificarUsuarioMenu();
                        frm.CurrentUsuario = _usuario;
                        frm.Nuevo();
                        frm.CurrentRol = currentRol;
                        frm.Show();
                        blokear();
                    }
                    else if (isNew == false)
                    {
                        FrmVerificarUsuarioMenu frm = new FrmVerificarUsuarioMenu();
                        frm.CurrentUsuario = _usuario;
                        frm.Editar();
                        frm.CurrentRol = currentRol;
                        frm.Show();
                        blokear();
                    }
            }
            else
                MessageBox.Show("Debe completar todos los campos", "Mensaje", MessageBoxButtons.OK);
        }

        public void blokear()
        {
            GBDatos.Enabled = false;
            gbDetalleUsuario.Enabled = false;
        }

        private void descripcionComboBox_Click(object sender, EventArgs e)
        {
            rOLBindingSource.DataSource = rolBL.GetAllFromRol();
        }

        private void descripcionComboBox_SelectedValueChanged(object sender, EventArgs e)
        {
            if (CBRol.SelectedValue != null)
            {
                rolIdTextBox.Text = CBRol.SelectedValue.ToString();
            }
        }

        /*crear nuevo rol*/
        private void button1_Click(object sender, EventArgs e)
        {
            FrmMttoRol frm = new FrmMttoRol();
            frm.Nuevo();
            frm.ShowDialog();
        }

        /*boton para avanzar en la grilla*/
        private void button2_Click(object sender, EventArgs e)
        {
            Avanzar();
        }

        /*boton para retroceder en la grilla*/
        private void button3_Click(object sender, EventArgs e)
        {
            int[] listaMant = new int[] { 1006,1007,1008,1009, 
                                                      1011,1012,1013,1014, 1016,1017,1018,1019, 
                                                      1021,1022,1023,1024, 1026,1027,1028,1029, 
                                                      1031,1032,1033,1034, 1036,1037,1038,1039, 
                                                      1041,1042,1043,1044, 1046,1047,1048,1049, 
                                                      1051,1052,1053,1054, 1056,1057,1058,1059, 
                                                      1061,1062,1063,1064, 1066,1067,1068,1069,
                                                      1071,1072,1073,1074, 1076,1077,1078,1079,
                                                      1081,1082,1083,1084, 1086,1087,1088,1089,
                                                      1091,1092,1093,1094, 1096,1097,1098,1099,
                                                      2006,2007,2008,2009, 2011, 2012, 2013,2014,
                                                      2016,2017,2018,2019,2021,2022,2023,2024,
                                                      3006,3007,3008,3009,
                                                      4006,4007,4008,4009, 4011,4012,4013,4014,
                                                      5006,5007,5008,5009,
                                                      6006,6007,6008,6009, 6011,6012,6013,6014};

            MENU currentMenu1 = mENUBindingSource.Current as MENU;

            if (currentMenu1.Tag >= 1005 && currentMenu1.Tag <= 2000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            else if (currentMenu1.Tag >= 2005 && currentMenu1.Tag <= 2030)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            else if (currentMenu1.Tag >= 3005 && currentMenu1.Tag <= 3020)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            else if (currentMenu1.Tag >= 4005 && currentMenu1.Tag <= 4020)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            else if (currentMenu1.Tag >= 5005 && currentMenu1.Tag <= 5020)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            else if (currentMenu1.Tag >= 6005 && currentMenu1.Tag <= 6020)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(currentMenu1.Tag);
            }
            else
            {
                foreach (var lista in listaMant)
                {
                    if (currentMenu1.Tag == lista)
                    {
                        mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTagByReturn(lista);
                    }
                }
            }
        }

        /*validar password con enter*/
        private void txtPasswd_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (passwordTextBox.Text == txtPasswd.Text && passwordTextBox.Text != "")
                {
                    MessageBox.Show("Password Correcta", "Mensaje", MessageBoxButtons.OK);
                    gbDetalleUsuario.Enabled = true;
                    mENUBindingSource.DataSource = menuBL.GetAllMenu();
                }
                else
                    MessageBox.Show("Password no Coinciden", "Mensaje", MessageBoxButtons.OK);
            }
        }

        /*evento doble click para avanzar n la grilla*/
        private void mENUDataGridView_DoubleClick(object sender, EventArgs e)
        {
            Avanzar();
        }

        /*metodo para avanzar en la grilla*/
        public void Avanzar()
        {
            int[] listaMant = new int[] { 1005, 1010, 1015, 1020, 1025, 1030, 1035, 1040, 1045, 1050, 1055, 1060, 1065, 1070, 1075, 1080,
                                                      1085, 1090, 1095, 2005, 2010, 2015, 2020, 3005, 4005, 4010, 5005, 6005, 6010 };

            MENU currentMenu1 = mENUBindingSource.Current as MENU;

            if (currentMenu1.Tag == 1000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(1000);
            }
            else if (currentMenu1.Tag == 2000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(2000);
            }
            else if (currentMenu1.Tag == 3000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(3000);
            }
            else if (currentMenu1.Tag == 4000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(4000);
            }
            else if (currentMenu1.Tag == 5000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(5000);
            }
            else if (currentMenu1.Tag == 6000)
            {
                mENUBindingSource.DataSource = menuBL.GetAllFromMenuByTag(6000);
            }
            else
            {
                foreach (var lista in listaMant)
                {
                    if (currentMenu1.Tag == lista)
                    {
                        mENUBindingSource.DataSource = menuBL.GetAllFromMenuByMantenimientoByTag(lista);
                    }
                }
            }
        }
    }
}

